/*-----------------------------------------------------
 * File: OUTDRV.c
 *
 * Purpose:  Virtual Obj OutDrv 
 *
 *
 * Description:  
 * 
 * Version: 0.01 a0
 *             
 * Copyright 2000 ArSilicii srl
 *-----------------------------------------------------*/
      
#include "hal.h"   /* Include Constant Globali */  
#include "OutDrv.h"

union uOB OutDrv ={0x00,0x00,0x00,0x00};

//
//  Segment Definition
//
//           ---
//          | a |
//        f |   | b
//           ---
//          | g |
//        e |   | c
//           --- 
//            d   . dot


static char a2s[]= {

  0                  ,  //  " " (0x20)
  0                  ,  //  "!"
  sb+sf              ,  //  """
  0                  ,  //  "#"
  0                  ,  //  "$"     
  0                  ,  //  "%"   
  0                  ,  //  "&"
  sf                 ,  //  "'"
  0                  ,  //  "("
  0                  ,  //  ")"
  0                  ,  //  "*" 
  0                  ,  //  "+"   
  se                 ,  //  "," 
  sg                 ,  //  "-"
  sd                 ,  //  "." 
  sb+se+sg           ,  //  "/"

  sa+sb+sc+sd+se+sf,    //  "0" (0x30)
  sb+sc,                //  "1"
  sa+sb+sd+se+sg,       //  "2"
  sa+sb+sc+sd+sg,       //  "3"
  sb+sc+sf+sg,          //  "4"     
  sa+sc+sd+sf+sg,       //  "5"   
  sa+sc+sd+se+sf+sg,    //  "6"
  sa+sb+sc,             //  "7"
  sa+sb+sc+sd+se+sf+sg, //  "8"
  sa+sb+sc+sd+sf+sg,    //  "9"
  0                  ,  //  ":" blank
  sg                 ,  //  "," -
  sa+sd+se+sf        ,  //  "<" [
  sd+sg              ,  //  "="
  sa+sb+sc+sd        ,  //  ">" ]
  sa+sb+se+sg        ,  //  "?"
  
  sa+sb+sd+se+sf+sg  ,  //  "@"  (0x40)
  sa+sb+sc+se+sf+sg  ,  //  "A"
  sc+sd+se+sf+sg     ,  //  "B" b
  sa+sd+se+sf        ,  //  "C"
  sb+sc+sd+se+sg     ,  //  "D" d
  sa+sd+se+sf+sg     ,  //  "E"
  sa+se+sf+sg        ,  //  "F"
  sa+sc+sd+se+sf+sg  ,  //  "G"
  sb+sc+se+sf+sg     ,  //  "H"
  sb+sc              ,  //  "I"
  sb+sc+sd+se        ,  //  "J"
  0                  ,  //  "K"
  sd+se+sf           ,  //  "L"
  sa+sb+sc+se+sf     ,  //  "M"
  sc+se+sg           ,  //  "N" n
  sc+sd+se+sg        ,  //  "O" o
  
  sa+sb+se+sf+sg     ,  //  "P"  (0x50)
  sa+sb+sc+sf+sg     ,  //  "Q" q
  se+sg              ,  //  "R" r
  sa+sc+sd+sf+sg     ,  //  "S"
  sd+se+sf+sg        ,  //  "T" t
  sc+sd+se           ,  //  "U" u
  0                  ,  //  "V"
  0                  ,  //  "W"
  sb+sc+se+sf+sg     ,  //  "X" H
  sb+sc+sd+sf+sg     ,  //  "Y" y
  sa+sb+sd+se+sg        //  "Z" 2
  
};



char  OutDrv_d2s(char in){
        return(a2s[in+0x10]);
}

void Disp_Flashing_string(unsigned char *s,unsigned char digit){
      static char toggle;
      Disp_string(s);
      if(toggle++ &0x01){
          OutDrv.v[digit] &= 1;
      }
}

void Disp_string(unsigned char *s){
      unsigned char *c,i;
      c=s;
      i=4;
      while((*c) && i){        
              OutDrv.v[--i]=a2s[(*c)-0x20];
              c++;
              if ((*c)=='.'){
                OutDrv.v[i] |= 1;
                c++;
              };              
      };
}

void Disp_unsigned(unsigned int num){
      unsigned char i;
      i=0;
      OutDrv.v[i++]= OutDrv_d2s(num % 10);
      num /= 10;
      OutDrv.v[i++]= OutDrv_d2s(num % 10);
      num /= 10;
      OutDrv.v[i++]= OutDrv_d2s(num % 10);
      num /= 10;
      OutDrv.v[i]= OutDrv_d2s(num % 10);
}


void   OutDrv_Reset(void) {
}

  
void   OutDrv_Clk(void) {
        char i,b,byte;

        for(i=0;i<=3;i++){  
            byte=OutDrv.v[3-i];
            for(b=0;b<=7;b++) {
               ClrPortBit(SR_PORT,SR_Clk); 
               if(byte & 0x01) SetPortBit(SR_PORT,SR_Out); else ClrPortBit(SR_PORT,SR_Out); 
               byte>>=1;
               _NOP();
               _NOP();
              SetPortBit(SR_PORT,SR_Clk);
               _NOP();       
            };
        
        };

         _NOP();
         _NOP(); 
         SetPortBit(SR_PORT,SR_RClk);
         _NOP();
         _NOP();         
         _NOP();
         _NOP();        

         ClrPortBit(SR_PORT,SR_RClk);

}
 
